package br.webcrawler.activities.webcrawler.utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

/**
 * Classe responsável pela manipulação dos arquivos.
 * @author Gerson Groth
 */
public class FileManager {

    private static FileWriter arquivo = null;

    public static void openFile(String arq) {
        try {
            File nome = new File(arq);
            if (nome.exists()) {
                arquivo = new FileWriter(nome, true);
            } else {
                arquivo = new FileWriter(nome);
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.err.print("ERRO: Impossível gravar no arquivo");
        }
    }

    public static void deleteFile(String arq) {
        try {
            File nome = new File(arq);
            if (nome.exists()) {
                nome.delete();
            }
        } catch (Exception e) {
            System.err.print("ERRO: Impossível deletar arquivo");
        }
    }

    public static void limpaFile(String arq) {
        try {
            arquivo = new FileWriter(arq);
        } catch (Exception e) {
            System.err.print("ERRO: Impossível limpar no arquivo");
        }
    }

    public static boolean testaVazio( String arq){
        boolean retorno = false;
        try {
            BufferedReader ler = new BufferedReader(new FileReader(arq));
            if (ler.ready()) {
                retorno = true;
            }
            ler.close();
        } catch (IOException e) {
            System.err.print("ERRO: Impossivel ler o arquivo " + arq);
        }
        return retorno;
    }

    /**
     * Escreve a palavra no arquivo passado como parametro.
     * @param palavra
     * @param arq
     */
    public static void escrever(String palavra, String arq) {
        try {
            openFile(arq);
            BufferedWriter entrada = new BufferedWriter(arquivo);
            entrada.write(palavra);
            entrada.newLine();
            entrada.flush();
            entrada.close();
            arquivo.close();
        } catch (IOException e) {
            System.err.print("ERRO: Impossivel gravar no arquivo");
            e.printStackTrace();
        }
    }

    /**
     * Escreve o ArrayList no arquivo passados como parametro.
     * @param palavras
     * @param arq
     */
    public static void escrever(ArrayList<String> palavras, String arq) {
        try {
            openFile(arq);
            BufferedWriter entrada = new BufferedWriter(arquivo);
            int len = palavras.size();
            System.out.println(len);
            for (int i = 0; i < len; i++) {
                String palavra = palavras.get(i);
                entrada.write(palavra);
                entrada.newLine();
                entrada.flush();
            }
            entrada.close();
            arquivo.close();
        } catch (IOException e) {
            System.err.print("ERRO: Impossivel gravar no arquivo");
            e.printStackTrace();
        }
    }

    /**
     * Reescreve o ArrayList no arquivo passados como parametro.
     * @param palavras
     * @param arq
     */
    public static void reEscrever(ArrayList<String> palavras, String arq) {
        try {
            //apaga arquivo antigo
            File nome = new File(arq);
            arquivo = new FileWriter(nome);

            //reescreve todo o arquivo
            BufferedWriter entrada = new BufferedWriter(arquivo);
            int len = palavras.size();
            for (int i = 0; i < len; i++) {
                String palavra = palavras.get(i);
                entrada.write(palavra);
                entrada.newLine();
                entrada.flush();
            }
            entrada.close();
            arquivo.close();
        } catch (IOException e) {
            System.err.print("ERRO: Impossivel gravar no arquivo");
            e.printStackTrace();
        }
    }

    /**
     * Le o arquivo passado como parametro e retorna cada linha como uma
     * referencia no ArrayList.
     * @param arquivo
     * @return
     */
    public static ArrayList<String> ler(String arquivo) {
        ArrayList<String> dados = new ArrayList<String>();
        try {
            BufferedReader ler = new BufferedReader(new FileReader(arquivo));
            while (ler.ready()) {
                String linha = ler.readLine();
                dados.add(linha);
               
            }
            ler.close();
        } catch (IOException e) {
            System.err.print("ERRO: Impossivel ler o arquivo");
            e.printStackTrace();
        }
        return dados;
    }
}
